//package com.klun.concTrueWar.five;
//
//import java.util.concurrent.BrokenBarrierException;
//import java.util.concurrent.CyclicBarrier;
//
///**
// * 通过 CyclicBarrier 协助细胞自动衍生系统中的计算
// */
//public class CellularAutomata {
//
//    //TODO 为找到 Board 的使用方式
//    private final Board mainBoard;
//    private final CyclicBarrier barrier;
//    private final Worker[] workers;
//
//    public CellularAutomata(Board board){
//        this.mainBoard = board;
//        int count = Runtime.getRuntime().availableProcessors();
//        this.barrier = new CyclicBarrier(count, new Runnable() {
//            @Override
//            public void run() {
//                // 提交新值
//                mainBoard.commitNewValues();
//            }
//        });
//        this.workers = new Worker[count];
//        for (int i = 0; i < count; i++) {
//            // 给 worker 赋值
//            workers[i] = new Worker(mainBoard.getSubBoard(count,i));
//        }
//    }
//
//    private class Worker implements Runnable{
//        private final Board board;
//
//        private Worker(Board board) {
//            this.board = board;
//        }
//
//        @Override
//        public void run() {
//            while (!board.hasConverged()){
//                // 获取最大值
//                for (int i = 0; i < board.getMaxX(); i++) {
//                    for (int j = 0; j < board.getMaxY(); j++) {
//                        board.setNewValue(x,y,computeValue(x,y));
//                    }
//                }
//                try{
//                    barrier.await();
//                } catch (InterruptedException e) {
//                    return;
//                } catch (BrokenBarrierException e) {
//                    return;
//                }
//            }
//        }
//    }
//    public void start(){
//        for (int i = 0; i < workers.length; i++) {
//            new Thread(workers[i]).start();
//            mainBoard.waitForConvergence();
//        }
//    }
//
//}
//class Board{
//
//    public void commitNewValues() {
//    }
//    public Board getSubBoard(int count,int i){
//        return null;
//    }
//    public boolean hasConverged(){
//        return true;
//    }
//    public int getMaxX(){
//        return 2;
//    }
//    public void waitForConvergence(){
//    }
//}
